<?php
require_once 'PHPUnit/Framework.php';
require_once "amicitia/conf/Conf.class.php";
require_once 'amicitia/arquitectura/Cargador.class.php';
def("amicitia/persistencia/daos/","ConexionBD");
def("amicitia/persistencia/daos/","FabricaDao");
def("amicitia/modelo/entidades/","Grupo");
def("amicitia/modelo/entidades/","Juego");
def("amicitia/modelo/entidades/","Pareja");
def("amicitia/modelo/entidades/","Persona");
def("amicitia/modelo/ejecucion/reglas/","ReglaJuegoAnterior");
def("amicitia/modelo/ejecucion/reglas/","ReglaParejaImposible");

/**
 * @author Willy A. Kuster
 */
class PruebaDaoJuego extends PHPUnit_Framework_TestCase {

	private $daoJuego;

	/**
	 * Realiza la conexión a la base de datos y crea una instancia de
	 * DaoJuego.
	 */
	protected function setUp() {
		ConexionBD::getConexionBD()->conectar();
		$fabricaDao = FabricaDao::obtenerFabrica();
		$this->daoJuego = $fabricaDao->obtenerDaoJuego();
	}
	
	/**
	 * Prueba la obtención de un Juego.
	 */
	public function testObtenerJuego() {
		$idJuego = 1;
		$idGrupo = 1;
		
		$juegoEsperado = new Juego();
		$juegoEsperado->setId($idJuego);
		$juegoEsperado->setOcasion("Navidades 2008");
		$juegoEsperado->setFecha("2008-12-27 16:37:23");
		$juegoEsperado->setReglas(null);
		$juegoEsperado->setEstatus(1);
		$juegoEsperado->setEsVisible(true);
		
		$grupoEsperado = new Grupo();
		$grupoEsperado->setId($idGrupo);
		$grupoEsperado->setNombre("Cubix");
		$grupoEsperado->setPassword("9d658601daa1ec698009c58d765de05d353b41eb");
		$grupoEsperado->setEsVisible(true);
		
		$juegoEsperado->setGrupo($grupoEsperado);
		
		$juego = $this->daoJuego->obtenerJuego($idJuego);
		$this->assertEquals($juegoEsperado, $juego);
	}
	
/**
	 * Prueba la carga de las propiedades lazy de un Juego.
	 */
	public function testCargarLazyJuego() {
		$idJuego = 1;
		
		$juego = $this->daoJuego->obtenerJuego($idJuego);
		
		$juego = $this->daoJuego->cargarJugadores($juego);
		$juego = $this->daoJuego->cargarParejas($juego);
		$juego = $this->daoJuego->cargarRegalados($juego);
		$juego = $this->daoJuego->cargarRegalantes($juego);
		$juego = $this->daoJuego->cargarDeseos($juego);
		$juego = $this->daoJuego->cargarQuinielas($juego);
		
		$this->assertTrue(is_array($juego->getJugadores()));
		$this->assertTrue(is_array($juego->getParejas()));
		$this->assertTrue(is_array($juego->getRegalados()));
		$this->assertTrue(is_array($juego->getRegalantes()));
		$this->assertTrue(is_array($juego->getDeseos()));
		$this->assertTrue(is_array($juego->getQuinielas()));
	}
	
	/**
	 * Prueba el caso en el que se pase un id que no tiene un registro asociado
	 * en la base de datos.
	 */
	public function testObtenerPersonaNoExistente() {
		$juego = $this->daoJuego->obtenerJuego(0);
		$this->assertEquals(NULL, $juego);
	}
	
	/**
	 * Prueba el guardado de un Juego en la base de datos junto con un Grupo nuevo.
	 */
	public function testGuardarJuegoConGrupoNuevo() {
		$juego = new Juego();
		$juego->setOcasion("Ocasion");
		$juego->setReglas(null);
		$juego->setEstatus(1);
		$juego->setEsVisible(true);
		
		$grupo = new Grupo();
		$grupo->setNombre("nombregrupo");
		$grupo->setPassword("poko");
		$grupo->setEsVisible(true);
		
		$juego->setGrupo($grupo);
		
		$idJuego = $this->daoJuego->guardarJuego($juego);
		
		$juegoGuardado = $this->daoJuego->obtenerJuego($idJuego);
		
		$idGrupo = $juegoGuardado->getGrupo()->getId();
		
		$juego->setId($idJuego);
		$juego->setFecha($juegoGuardado->getFecha());
		$juego->getGrupo()->setId($idGrupo);
		$juego->getGrupo()->setPassword("b0758387fdcb58fb0e92347cc80cc05bc27d67e7");
		
		$this->assertEquals($juego, $juegoGuardado);
	}
	
	/**
	 * Prueba el guardado de un Juego en la base de datos junto con un Grupo existente.
	 */
	public function testGuardarJuegoConGrupoExistente() {
		$juego = new Juego();
		$juego->setOcasion("Ocasion");
		
		$reglaAno = new ReglaJuegoAnterior();
		$reglaPareja = new ReglaParejaImposible();
		
		$pareja = new Pareja();
		$pareja->setId(11);
		
		$dador = new Persona();
		$dador->setId(10);
		$dador->setAlias("willykc");
		$dador->setNombre("Willy");
		$dador->setPassword("332caee2c3b1786392e8cf5f046f115edb206078");
		$dador->setApellido("Kuster");
		$dador->setEmail("willykc@gmail.com");
		$dador->setSexo("m");
		$pareja->setDador($dador);
		
		$receptor = new Persona();
		$receptor->setId(7);
		$receptor->setAlias("rigo");
		$receptor->setPassword("461b992e3aaa155a76b273abaed0f616cd41ba1c");
		$receptor->setNombre("Rigoberto");
		$receptor->setApellido("Jorges");
		$receptor->setEmail("rigzar@hotmail.com");
		$receptor->setSexo("m");
		$pareja->setReceptor($receptor);
		
		$reglaPareja->setParejaImposible($pareja);
		
		$reglas[0] = $reglaAno;
		$reglas[1] = $reglaPareja;
		
		$juego->setReglas($reglas);
		$juego->setEstatus(1);
		$juego->setEsVisible(true);
		
		$idGrupo = 1;
		$grupo = new Grupo();
		$grupo->setId($idGrupo);
		$grupo->setNombre("Cubix");
		$grupo->setPassword("9d658601daa1ec698009c58d765de05d353b41eb");
		$grupo->setEsVisible(true);
		
		$juego->setGrupo($grupo);
		
		$personas[$dador->getId()] = $dador;
		$personas[$receptor->getId()] = $receptor;
		
		$juego->setJugadores($personas);
		
		$idJuego = $this->daoJuego->guardarJuego($juego);
		
		$juegoGuardado = $this->daoJuego->obtenerJuego($idJuego);
		$juegoGuardado = $this->daoJuego->cargarJugadores($juegoGuardado);
		
		$juego->setId($idJuego);
		$juego->setFecha($juegoGuardado->getFecha());
		
		$this->assertEquals($juego, $juegoGuardado);
	}
	
	/**
	 * Prueba la eliminacion de un Juego en la base de datos.
	 */
	public function testEliminarJuego() {
		$juego = new Juego();
		$juego->setOcasion("Ocasion");
		$juego->setReglas(null);
		$juego->setEstatus(1);
		$juego->setEsVisible(true);
		
		$grupo = new Grupo();
		$grupo->setNombre("nombregrupo");
		$grupo->setPassword("poko");
		$grupo->setEsVisible(true);
		
		$juego->setGrupo($grupo);
		
		$id = $this->daoJuego->guardarJuego($juego);
		
		$exito = $this->daoJuego->eliminarJuego($id);
		
		$juego = $this->daoJuego->obtenerJuego($id);
		
		$this->assertTrue($exito);
		$this->assertEquals(NULL, $juego);
	}
	
	/**
	 * Deshace todos los cambios y cierra la conexión a la base de datos.
	 */
	protected function tearDown() {
		ConexionBD::getConexionBD()->deshacer();
		ConexionBD::getConexionBD()->desconectar();
	}
	
}
?>